package com.flowable.modules.modeler.handler;

import org.flowable.bpmn.model.FlowElement;
import org.flowable.bpmn.model.UserTask;
import org.flowable.engine.delegate.DelegateExecution;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

/**
 * 作为对象传入，是多人会签执行方法的对象
 * @Author: qianfang
 * @Date: 2021/1/14 16:49
 */
public class MultiInstanceHandler implements Serializable {
    private static final long serialVersionUID = 1L;

    public List<String> getList(DelegateExecution execution) {
        FlowElement flowElement = execution.getCurrentFlowElement();
        UserTask userTask = (UserTask) flowElement;
        List<String> stringList = new ArrayList<>();
        stringList.addAll(userTask.getCandidateGroups());
        stringList.addAll(userTask.getCandidateUsers());
        return stringList;
    }

    public boolean getComplete(DelegateExecution execution) {
        Integer nrOfCompletedInstances = (Integer) execution.getVariable("nrOfCompletedInstances");
        Integer nrOfInstances = (Integer) execution.getVariable("nrOfInstances");
        int agreeCount = 0, rejectCount = 0, abstainCount = 0;
        Map<String, Object> vars = execution.getVariables();
        for (String key : vars.keySet()) {

            if(key.contains("flag")) {
                Integer value = (Integer) vars.get(key);
                if(1 == value) {
                    agreeCount++;
                } else {
                    rejectCount++;
                }
            }

            //会签投票以SIGN_VOTE+TaskId标识
            //获得会签投票的统计结果
//            if (key.contains(FlowConst.SIGN_VOTE) && !key.equals(FlowConst.SIGN_VOTE_RESULT)) {
//                Integer value = (Integer) vars.get(key);
                //统计同意、驳回、弃权票数
                //省略代码若干......
//            }
        }
        //以下为一段简单的规则，可以按情况实现自己的会签规则
        if(rejectCount > 0) {
            //存在一个以上反对
            execution.setVariable("flag", 0);
            //会签结束
            return true;
        }

        if (!nrOfCompletedInstances.equals(nrOfInstances)) {
            //必须等所有的办理人都投票
            return false;
        } else {
            //会签全部完成时,使用默认规则结束
            if (rejectCount > 0) {
                //有反对票，则最终的会签结果为不通过
                //移除SIGN_VOTE+TaskId为标识的参数
//                removeSignVars(execution);
                //增加会签结果参数，以便之后流转使用
//                execution.setVariable(FlowConst.SIGN_VOTE_RESULT, false);
                execution.setVariable("flag", 0);
                //会签结束
                return true;
            } else {
                //没有反对票时，则最终的会签结果为通过
//                removeSignVars(execution);
                execution.setVariable("flag", 1);
                return true;
            }
        }

    }

}
